﻿using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Moq;
using Triunfadores.BusinessEntities;
using Triunfadores.BusinessLogic;
using Triunfadores.BusinessLogic.Service;
using Triunfadores.Repository;

namespace Triunfadores.Test
{
    [TestClass]
    public class ClienteTest
    {
        public readonly IClienteService MockClienteService;

        public ClienteTest()
        {
            var ClientesList = new List<Cliente>()
            {
                //new Cliente()
                //{
                //    Id = 1, Apellidos = "Saavedra Guarniz", IdBeneficiario = null,  CentroTrabajo = "Su casa", Direccion = "Jr. San Juan 189",
                //    Dni = "47701560", Email = "ogeny@gmail.com", FechIngreso = DateTime.Parse("12/12/2012"),FechNacimiento = DateTime.Parse("12/12/2012"),
                //    FechRetiro = null, IdTipoCliente = 1, LugarNacimiento = "Cajamarca", Nombres = "Oscar", NroHijos = "2", Ocupacion = "Estudiante", 
                //    Telefono = "987784094"
                //},
                //new Cliente()
                //{
                //    Id = 2, Apellidos = "Saavedra Guarniz", IdBeneficiario = null,  CentroTrabajo = "Su casa", Direccion = "Jr. San Juan 189",
                //    Dni = "47701562", Email = "rosasaag@gmail.com", FechIngreso = DateTime.Parse("12/12/2015"),FechNacimiento = DateTime.Parse("31/07/1999"),
                //    FechRetiro = null, IdTipoCliente = 1, LugarNacimiento = "Cajamarca", Nombres = "Rosa Imelda", NroHijos = "0", Ocupacion = "Estudiante", 
                //    Telefono = "987784094"
                //}
                
            };


            
            Mock<IClienteService> clienteServiceMock = new Mock<IClienteService>();

            //obtener todos los clientes
            clienteServiceMock.Setup(mr => mr.ObtenerTodosLosClientes()).Returns(ClientesList);

            //devolver clientes por nombre
            clienteServiceMock.Setup(a => a.ObtenerClientesPorCriterio(It.IsAny<string>())).Returns(ClientesList);

            //devolver por id
            clienteServiceMock.Setup(a => a.GetClienteById(It.IsAny<Int32>()))
                .Returns((int id) => ClientesList.Where(a => a.Id == id).SingleOrDefault());

            //AddAccion
            clienteServiceMock.Setup(a => a.AddCliente(It.IsAny<Cliente>()))
                .Callback((Cliente cliente) =>
                {
                    ClientesList.Add(cliente);
                });

            MockClienteService = clienteServiceMock.Object;

        }

        [TestMethod]
        public void ObtenerTodosLosClientesTest()
        {
            var testClientes = this.MockClienteService.ObtenerTodosLosClientes();
            Assert.IsNotNull(testClientes);
            Assert.AreEqual(2, testClientes.Count());
        }

        [TestMethod]
        public void ObtenerClientesPorNombreTest()
        {
            var nombre = "Oscar";
            var testAcciones = this.MockClienteService.ObtenerClientesPorCriterio(nombre);
            Assert.IsNotNull(testAcciones);
            //Assert.AreEqual(7, testAcciones.Count());
            Assert.IsTrue(testAcciones.Count() >= 1);

        }

        [TestMethod]
        public void ObtenerClientePorDni()
        {
            ClienteRepository target = new ClienteRepository();
            var dni = "98899898";
            Cliente actual;
            actual = target.FindSearchingFromClienteByDni(dni);
            Assert.IsTrue(actual.Dni == "98899898");
            //Assert.IsTrue(actual.Count >= 1);
            //Assert.IsNotNull(actual);
        }

        /// <summary>
        /// obtener el cliente avalador que solo puede ser de tipo socio
        /// </summary>
        [TestMethod]
        public void ObtenerAvaladorPorDni()
        {
            ClienteRepository target = new ClienteRepository();
            var dni = "12345678";
            Cliente actual;
            actual = target.FindSearchingFromAvaladorByDni(dni);
            Assert.IsTrue(actual.Dni == "12345678");
            //Assert.IsTrue(actual.Count >= 1);
            //Assert.IsNotNull(actual);
        }


        [TestMethod]
        public void ObtenerClientePorId()
        {
            ClienteRepository target = new ClienteRepository();
            int id = 6;
            Cliente actual;
            actual = target.GetClienteById(id);
            Assert.IsTrue(actual.Id == 6);
        }

        [TestMethod]
        public void AddCliente()
        {
            var NewCliente = new Cliente()
            {
                Id = 3,
                Apellidos = "Saavedra Guarniz",
                //IdBeneficiario = null,
                CentroTrabajo = "Su casa",
                Direccion = "Jr. San Juan 189",
                Dni = "47701561",
                Email = "romelsaag@gmail.com",
                FechIngreso = DateTime.Parse("12/12/2013"),
                FechNacimiento = DateTime.Parse("12/12/1989"),
                FechRetiro = null,
                IdTipoCliente = 2,
                //LugarNacimiento = "Cajamarca",
                Nombres = "Romel Salomon",
                NroHijos = "0",
                Ocupacion = "Mecanico",
                Telefono = "976150615"
            };

            this.MockClienteService.AddCliente(NewCliente);

            var testAccion = this.MockClienteService.ObtenerTodosLosClientes();

            Assert.IsNotNull(testAccion);
            Assert.AreEqual(3, testAccion.Count());

            //ClienteService catDAO = new ClienteService();
            //var ListEsperado = (IEnumerable<Cliente>)catDAO.ObtenerTodosLosClientes();
            

            //catDAO.AddCliente(NewCliente);
            //var ListaCTUAL = (IEnumerable<Cliente>)catDAO.ObtenerTodosLosClientes();
            //Assert.AreEqual(ListEsperado.Count() + 1, ListaCTUAL.Count(), "Error ");

        }

        
       
    

    }
}
